package com.heima.service;

import com.heima.model.article.dtos.ArticleDto;
import com.heima.model.article.dtos.ArticleHomeDto;
import com.heima.model.article.dtos.ArticleInfoDto;
import com.heima.model.article.dtos.CollectionBehaviorDto;
import com.heima.model.article.mess.ArticleVisitStreamMess;
import com.heima.model.article.pojos.Article;
import com.baomidou.mybatisplus.extension.service.IService;
import com.heima.model.common.dtos.ResponseResult;
import freemarker.template.TemplateException;
import io.minio.errors.*;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
* @author chenshan
* @description 针对表【ap_article(文章信息表，存储已发布的文章)】的数据库操作Service
* @createDate 2022-10-14 17:01:13
*/
public interface ArticleService extends IService<Article> {

    /**
     * APP端文章首页数据请求
     * @param homeDto homeDto
     * @return ResponseResult
     */
    ResponseResult load(ArticleHomeDto homeDto);

    /**
     * 下拉加载最新数据
     * @param homeDto homeDto
     * @return ResponseResult
     */
    ResponseResult loadNew(ArticleHomeDto homeDto);

    /**
     * 上啦加载更多数据
     * @param homeDto homeDto
     * @return ResponseResult
     */
    ResponseResult loadMore(ArticleHomeDto homeDto);

    /**
     * 发布文章
     * @param articleDto 文章内容
     * @return ResponseResult
     */
    ResponseResult saveArticle(ArticleDto articleDto) throws IOException, TemplateException, InvalidResponseException, InvalidKeyException, NoSuchAlgorithmException, ServerException, ErrorResponseException, XmlParserException, InvalidBucketNameException, InsufficientDataException, InternalException;

    /**
     * 根据文章id查询文章内容（es测试）
     * @param articleId 文章id
     * @return ResponseResult
     */
    ResponseResult findOneById(Long articleId);

    /**
     * 查询所有文章 已经上架且没有被删除（es测试）
     * @return ResponseResult
     */
    ResponseResult findAll();

    /**
     * 用户行为 - 文章收藏
     * @param behaviorDto 收藏信息
     * @return ResponseResult
     */
    ResponseResult collectionBehavior(CollectionBehaviorDto behaviorDto);

    /**
     * 加载文章行为 - 数据回显
     * @param infoDto 文章信息
     * @return ResponseResult
     */
    ResponseResult loadArticleBehavior(ArticleInfoDto infoDto);

    /**
     * 根据频道id查询文章（查询此频道是否有文章）
     *
     * @param id 频道id
     * @return ResponseResult
     */
    ResponseResult findArticleByChannelId(Integer id);

    /**
     * 查询最近5天的文章数据（未下架 未删除）
     *
     * @return boolean
     */
    ResponseResult selectFiveDaysArticle();

    /**
     * 接收kafka消息后更新MYSQL和Redis
     * @param articleVisitStreamMess ArticleVisitStreamMess
     */
    void updateScore(ArticleVisitStreamMess streamMess);
}
